Deno Fresh CRUD API
Fresh CRUD API
CRUD APIの作成
MDNドキュメントは、HTTPメソッドについて学ぶのに非常に役立つリソースです。ここでは、基本的なCRUD(作成、読み取り、更新、削除)APIを作成するために必要な4つの基本的なメソッドに触れます。加えて、CORSリクエストやOPTIONSメソッドがどのように関係するかも簡単に説明します。
HTTPメソッドを使用することは、REST APIを作成する一般的な方法です。Freshは、ハンドラ内で一般的なHTTPメソッドを標準でサポートしています。また、非同期HTTPリクエストもサポートされています。カスタムハンドラについては、こちらで詳しく読むことができます。
この例では、Deno KVを使用してデータベースにユーザーを保存する小さなAPIを作成します。
プロジェクトの構成は次のようになります(新規プロジェクトのFreshコードに加えて):
routes
└── api
└── users
├── [id].ts
└── index.ts
各メソッドに関するセクションでは、関連するハンドラのみが表示されます。完全なファイルは、参考のために最後に示されています。
POST
POST(create)はリソースを作成するために使用されます。
export const handler: Handlers<User | null> = {
async POST(req, _ctx) {
const user = (await req.json()) as User;
const userKey = ["user", user.id];
const ok = await kv.atomic().set(userKey, user).commit();
if (!ok) throw new Error("Something went wrong.");
return new Response(JSON.stringify(user));
},
};
Postman(またはお好みのクライアント)を使って、http://localhost:8000/api/users のようなURLとPOSTメソッドでテストしてください。ペイロードは以下のようにしてください:
{
"id": "2",
"name": "TestUserName"
}
同じものが返ってくるはずです:
{ "id": "2", "name": "TestUserName" }
GET
GET(読み込み)はリソースを取得するために使用され、HTTPメソッドの中で最も一般的です。データベースのコンテンツ、マークダウン、静的ファイルなどを取得するためにGETを使うことができます。
export const handler: Handlers<User | null> = {
async GET(_req, ctx) {
const id = ctx.params.id;
const key = ["user", id];
const user = (await kv.get<User>(key)).value!;
return new Response(JSON.stringify(user));
},
};
ユーザーを取得する練習をしてみよう!http://localhost:8000/api/users/2:
{ "id": "2", "name": "TestUserName" }
PUT(およびPATCH)
PUT(更新)とPATCHはリソースを更新するために使用されます。似てはいますが、違いがあるので、使用するケースに応じて使い分ける必要があります。MDNでHTTPメソッドについてもっと読む。
簡単に説明すると PUT はオブジェクト全体を送信する必要があり、PATCH は異なるプロパティのみを送信する必要があります。
PUTを使用した更新エンドポイントの例:
export const handler: Handlers<User | null> = {
async PUT(req, ctx) {
const id = ctx.params.id;
const user = (await req.json()) as User;
const userKey = ["user", id];
const userRes = await kv.get(userKey);
if (!userRes.value) return new Response(`no user with id ${id} found`);
const ok = await kv.atomic().check(userRes).set(userKey, user).commit();
if (!ok) throw new Error("Something went wrong.");
return new Response(JSON.stringify(user));
},
};
名前を変えてみよう。http://localhost:8000/api/users/2:
{
"id": "2",
"name": "New Name"
}
次を受け取ります:
{ "id": "2", "name": "New Name" }
一方、これをPATCHオペレーションとして実装することにすれば、リクエストは次のように変更されたプロパティを含むだけになる:
{
"name": "New Name"
}
この場合 IDを送り必要はない。
DELETE
DELETE(削除)は、リソースを削除するために使用します。
export const handler: Handlers<User | null> = {
async DELETE(_req, ctx) {
const id = ctx.params.id;
const userKey = ["user", id];
const userRes = await kv.get(userKey);
if (!userRes.value) return new Response(`no user with id ${id} found`);
const ok = await kv.atomic().check(userRes).delete(userKey).commit();
if (!ok) throw new Error("Something went wrong.");
return new Response(`user ${id} deleted`);
},
};
http://localhost:8000/api/users/2
、本文なしでDELETEを送信してみてください。次が返されます:
user 2 deleted
オプション
オプションは、複雑なCORSユースケースのプリフライトリクエストチェックの実装など、いくつかの高度なケースに使用できます。詳細はCORSドキュメントを参照してください。 https://fresh.deno.dev/docs/examples/dealing-with-cors
メモ
Deno.openKv()
がないよって言われる。
Deno KVとは https://deno.com/kv というサービスのこと。
Deno KVは、Deno.Kvネームスペースで利用可能な、Denoランタイムに直接組み込まれたキー・バリュー・データベースです。これは、多くの種類のデータストレージのユースケースに使用できますが、非常に高速な読み取りと書き込みの恩恵を受ける単純なデータ構造を格納することに優れています。Deno KVは、Deno CLIとDeno Deployで利用可能です。
https://docs.deno.com/deploy/kv/manual/
/// <reference no-default-lib="true" />
をmain.ts
から削除したらエラーは出なくなったけど、ビルドでやっぱりエラーになる。
https://github.com/denoland/deno/issues/18907
https://docs.deno.com/api/deno/~/Deno.openKv
Deno Deploy以外の環境からDeno Deploy上のリソースを使いたい場合はurlを入力する必要があります。(https://qiita.com/KokiSakano/items/6a687154c63887c45413 より)
await Deno.openKv("https://api.deno.com/databases/XXX/connect");
まだでも安定してなさそうではある。。
